// using Microsoft.Extensions.Hosting;
// using NLog.Extensions.Logging;
// using SuperSocket.ProtoBase;
// using SuperSocket.Server.Abstractions;
// using SuperSocket.Server.Abstractions.Session;
// using SuperSocket.Server.Host;
//
// namespace sgf.server
// {
//     public class SuperSocketNetServer
//     {
//         private Dictionary<int, IAppSession> Sessions = new();
//
//         private Dictionary<IAppSession, int> Sessions2SessionId = new();
//
//         private Queue<int> CanUseSessionIds = new();
//
//         private int startSessionId = 1;
//
//         public async Task Start(int port)
//         {
//             var host = SuperSocketHostBuilder.Create<StringPackageInfo, CommandLinePipelineFilter>()
//                 .ConfigureSuperSocket(options =>
//                     {
//                         options.Name = "Echo Server";
//                         options.Listeners = new List<ListenOptions>
//                         {
//                             new()
//                             {
//                                 Ip = "Any",
//                                 Port = port
//                             }
//                         };
//                     }
//                 ).UseSessionHandler( // 会话连接建立的处理逻辑
//                     async (session) =>
//                     {
//                         var sessionId = CanUseSessionIds.Count == 0 ? startSessionId++ : CanUseSessionIds.Dequeue();
//                         Sessions[sessionId] = session;
//                         Sessions2SessionId[session] = sessionId;
//                         var pid = ActorCore.GetPid(typeof(OnlineActor));
//                         if (pid != null)
//                         {
//                             ActorCore.Send(pid, new Net2Online_AddSession
//                             {
//                                 sessionId = sessionId
//                             }, ActorCore.GetPid(typeof(NetActor)));
//                         }
//
//                         Console.WriteLine($"Session connected: {session.RemoteEndPoint}");
//                         await Task.CompletedTask;
//                     },
//                     // 会话断开的处理逻辑
//                     async (session, closeReason) =>
//                     {
//                         Sessions2SessionId.TryGetValue(session, out var sessionId);
//                         Sessions.Remove(sessionId);
//                         CanUseSessionIds.Enqueue(sessionId);
//                         Sessions2SessionId.Remove(session);
//                         Console.WriteLine($"Session {session.SessionID} {sessionId} disconnected");
//                         Console.WriteLine($"Session closed: {session.RemoteEndPoint}, Reason: {closeReason}");
//                         await Task.CompletedTask;
//                     })
//                 .UsePackageHandler(
//                     async (session, package) =>
//                     {
//                         await Task.CompletedTask;
//                         // var result = 0;
//                         // switch (package.Key.ToUpper())
//                         // {
//                         //     case ("ADD"):
//                         //         result = package.Parameters
//                         //             .Select(p => int.Parse(p))
//                         //             .Sum();
//                         //         break;
//                         //
//                         //     case ("SUB"):
//                         //         result = package.Parameters
//                         //             .Select(p => int.Parse(p))
//                         //             .Aggregate((x, y) => x - y);
//                         //         break;
//                         //
//                         //     case ("MULT"):
//                         //         result = package.Parameters
//                         //             .Select(p => int.Parse(p))
//                         //             .Aggregate((x, y) => x * y);
//                         //         break;
//                         // }
//                         //
//                         // await session.SendAsync(Encoding.UTF8.GetBytes(result + "\r\n"));
//                     })
//                 .ConfigureLogging((hostCtx, loggingBuilder) => { loggingBuilder.AddNLog(); })
//                 .Build();
//             await host.RunAsync();
//         }
//
//         public async Task Send(long sessionId, byte[] data)
//         {
//             await Task.CompletedTask;
//         }
//
//         //TerminatorPipelineFilter 
//         //TerminatorTextPipelineFilter 
//         //LinePipelineFilter 
//         //CommandLinePipelineFilter 
//         //BeginEndMarkPipelineFilter 
//         //FixedSizePipelineFilter 
//         //FixedHeaderPipelineFilter
//
//         //CommandFilterAttribute
//         //AsyncCommandFilterAttribute
//
//         //hostBuilder.UseCommand((commandOptions) =>
//         // {
//
//         //因为 .NET Core 应用程序反射时默认只在此程序的依赖树（*.deps.json）里寻找程序集。所以你的命令程序集如果没有被加为你的主程序的依赖，它可能不会被找到。解决这个问题，你需要在你的主程序根目录添加一个运行时配置文件 "runtimeconfig.json"。
//         // runtimeconfig.json
//         //
//         // {
//         //     "runtimeOptions": {
//         //         "Microsoft.NETCore.DotNetHostPolicy.SetAppPaths" : true            
//         //     }
//         // }
//
//         public async Task Send(int sessionId, byte[] data)
//         {
//             if (Sessions.TryGetValue(sessionId, out var session))
//             {
//                 //string 2 byte[]
//                 session.SendAsync(new ReadOnlyMemory<byte>(data));
//             }
//
//             await Task.CompletedTask;
//         }
//
//         public async Task OnMessage(long sessionId, byte[] data)
//         {
//             await Task.CompletedTask;
//         }
//
//         public void AddSession(Session session)
//         {
//         }
//     }
// }